import Vue from 'vue'
import Router from 'vue-router'
import login from '../views/login.vue'
import layout from '../views/layout.vue'
Vue.use(Router)




const router =new Router({
  routes: [
    {
      path: '/login',
      name: 'login',
      component: login
    },
    {
      path: '/layout',
      name: 'layout',
      meta:{tile:'首页'},
      redirect: '/index',//重定向，目的是为了刚进来的时候进入一个空白的页面
      component: layout,
      children:[
        {
          path:'/index',
          name:'index',
          meta:{tile:'首页'},
          component:()=>import('@/views/home/index.vue')
        }
      ]
    }
  ]
})
//对所有请求进行重定向到登录界面，后面再放开,to当前到哪个地方去，from离开到哪个，next下一个将要去的地方
router.beforeEach((to, from, next) => {
  if(to.path == "/login"){
    sessionStorage.removeItem('user');
    sessionStorage.removeItem('permissionButton');
    sessionStorage.removeItem('menu');
  }
  var user = sessionStorage.getItem('user');
  if(user==null && to.path != "/login"){
    next({
      path: '/login'
    })
  }else{
    next();
    if(router.options.routes.length==2){
      let items=sessionStorage.getItem('menu') // 将菜单列表存到sessionStorage
      items=JSON.parse(items);
      //由于这里的next执行后仍然会执行下方代码，所以需要判断一下是否进入的是登录页面，否则加载这个路由是不正确的方式,如果items是空自然就是登录界面
      //因为items来自于登录之后的缓存
      if(items!=null){
        const routers = getAsyncRoutes(items) // 根据菜单提取路由
        //router.matcher = new Router().matcher;
        routers.forEach(val => { // 将菜单提取出来的路由加到路由表
          router.options.routes.push(val)
          router.addRoute(val)
        })
      }
    }
  }
})
function getAsyncRoutes(routes) {
  const res = []
  routes.forEach(route => { // 所有菜单都是二级结构，一级没有页面功能，所以只要添加二级菜单的路由
    if (route.chrilds !== null) {
      const children = []
      route.chrilds.forEach(menu => { // 二级菜单需匹配页面
        children.push({
          path: menu.menuPath,
          name: menu.menuPath.split('/')[1],
          // 此处使用require，由于import会有奇怪的错误
          component: (resolve) => require([`@/views${menu.component}`], resolve),
          meta: { tile: menu.menuName,address:menu.externalAddress }
        })
      })
      res.push({
        path: route.menuPath,
        component: layout,
        meta: { tile: route.menuName },
        children: children
      })
    }
  })
  return res
}
export default router;
